package longestPath;
import ui.DoolhofUserInterface;
import ui.UIHulpMethodes;
import ui.UserInterfaceFactory;
import java.io.PrintStream;
import java.util.Scanner;




public class LongestPath {
	DoolhofUserInterface ui;
	static final int BREEDTE = 32;
	static final int HOOGTE = 24;
	static final int WACHTTIJD = 4;
	PrintStream out;

	LongestPath(){
		UIHulpMethodes.vraagGebruikerOmInvoer();
		out = new PrintStream(System.out);

	}
	
	void laatRijZien(CoordinateRow rij,int soort){
		for(int i = 0;i < rij.huidigAantal;i++){
			ui.plaats(rij.coordinaatRij[i].x, rij.coordinaatRij[i].y, soort);
		}
		ui.toon();
	}

	void voegLangsteToe(Veld veld, Coordinate nieuweCoordinaat){
		if(nieuweCoordinaat.isGelijkAan(veld.eind) && veld.pad.huidigAantal > veld.langstePad.huidigAantal){
			veld.langstePad = new CoordinateRow(veld.pad.huidigAantal);
			veld.langstePad.voegCoordinateRowToe(veld.pad);
		} 
	}


	void vindPad(Veld veld){
		ui.wacht(WACHTTIJD);
		for(int i = 0;i < veld.richting.huidigAantal;i++){
			Coordinate nieuweCoordinaat = new Coordinate(veld.pad.coordinaatRij[veld.pad.huidigAantal - 1].x,veld.pad.coordinaatRij[veld.pad.huidigAantal - 1].y);
			nieuweCoordinaat.verschuif(veld.richting.coordinaatRij[i]);
			if(!(veld.muren.checkOfInRow(nieuweCoordinaat)) && !(veld.pad.checkOfInRow(nieuweCoordinaat))){
				veld.pad.voegToe(nieuweCoordinaat);
				ui.plaats(nieuweCoordinaat.x, nieuweCoordinaat.y, ui.PAD);
				ui.toon();
				voegLangsteToe(veld,nieuweCoordinaat);
				vindPad(veld);
				ui.wacht(WACHTTIJD);
				ui.plaats(veld.pad.coordinaatRij[veld.pad.huidigAantal - 1].x, veld.pad.coordinaatRij[veld.pad.huidigAantal - 1].y, ui.LEEG);
				ui.toon();
				veld.pad.verwijderLaatste();
			}
		}
	}



	void laatVeldZien(Veld veld){
		laatRijZien(veld.muren,ui.MUUR);
		laatRijZien(veld.pad,ui.PAD);
		ui.plaatsOmcirkeling(veld.eind.x, veld.eind.y);
	}

	void leesMuren(String input,Veld veld){
		Scanner inputScan = new Scanner(input);
		while(inputScan.hasNext()){
			Coordinate coordinaat = new Coordinate(inputScan.nextInt(),inputScan.nextInt());
			veld.muren.voegToe(coordinaat);
		}
	}

	Coordinate leesCoordinaat(String input){
		Scanner inputScan = new Scanner(input);
		int x = inputScan.nextInt();
		int y = inputScan.nextInt();
		Coordinate coordinaat = new Coordinate(x,y);
		return coordinaat;
	}

	void leesInvoer(Veld veld){
		Scanner in = new Scanner(System.in);
		in.useDelimiter("=");
		veld.pad.voegToe(leesCoordinaat(in.next()));
		veld.eind = leesCoordinaat(in.next());
		leesMuren(in.next(),veld);
	}

	void start(){
		Veld veld = new Veld(BREEDTE,HOOGTE);
		ui = UserInterfaceFactory.geefDoolhofUI(BREEDTE, HOOGTE);
		leesInvoer(veld);
		laatVeldZien(veld);
		vindPad(veld);
		laatRijZien(veld.langstePad,ui.PAD);
		ui.printf("Het langste pad is %d lang.", veld.langstePad.huidigAantal);
	}

	public static void main(String[] args) {
		new LongestPath().start();
	}

}
